07 系统调用
glibc 对系统调用的封装
int open(const char *pathname, int flags, mode_t mode)
调用系统调用是使用 DO_CALL这个宏
32 位系统调用过程
- 用户态
- 将请求参数保存到寄存器
- 将系统调用名称转为系统调用号保存到寄存器 eax 中
- 通过软中断 ENTER_KERNEL 进入内核态
- 内核态
- 将用户态的寄存器保存到 pt_regs 中
- 在系统调用函数表 sys_call_table 中根据调用号找到对应的函数
- 执行函数实现, 将返回值写入 pt_regs 的 ax 位置
- 通过 INTERRUPT_RETURN 根据 pt_regs 恢复用户态进程
64 位系统调用过程
- 用户态
- 将请求参数保存到寄存器
- 将系统调用名称转为系统调用号保存到寄存器 rax 中
- 通过 syscall 进入内核态
- 内核态
- 将用户态的寄存器保存到 pt_regs 中
- 在系统调用函数表 sys_call_table 中根据调用号找到对应的函数
- 执行函数实现, 将返回值写入 pt_regs 的 ax 位置
- 通过 sysretq 返回用户态
系统调用表
sys_call_table:arch/x86/entry/syscall_64.c
2 common open sys_open
第一列 是系统调用号,第三列是系统调用的名字,第四列是系统调用在内核的实现函数。